
package pec4.tds.coordinador;

import pec4.tds.coordinador.Log;
import i18n.TDSLanguageUtils;
import pec4.tds.coordinador.Utils;
import pec4.tds.coordinador.excepciones.ExcepcionDriverBBDD;
import pec4.tds.coordinador.excepciones.ExcepcionNoFichPropiedades;
import java.util.*;
import java.io.*;
import java.sql.*;

/**
 * Acceso general a la base de datos. 
 * 
 */
public class conexionDAO
{
    public static final String propertiesFile = "./properties/configuration.properties";
    public static final String driver = "org.postgresql.Driver";
    private static boolean driverCargado = false;
    protected Connection conexion = null;
    private static String url = null;
    private static String usuario = null;
    private static String clave = null;
    private static Log log = Log.getInstance();
    protected Statement statement = null;
    protected ResultSet resultSet =  null;

/**
 * Constructor de la clase, carga el driver y el fichero de propiedades
 * @throws edu.uoc.tds.pec4.coordinador.excepciones.ExcepcionDriverBBDD
 * @throws edu.uoc.tds.pec4.coordinador.excepciones.ExcepcionNoFichPropiedades
 */
    public conexionDAO() throws ExcepcionDriverBBDD, ExcepcionNoFichPropiedades
    {
        cargaInicial();
    }

/**
 * Función que carga configuración de conexión a la BD, según fichero de propiedades.
 * @throws edu.uoc.tds.pec4.coordinador.excepciones.ExcepcionDriverBBDD
 * @throws edu.uoc.tds.pec4.coordindor.excepciones.ExcepcionNoFichPropiedades
 */
    private static void cargaInicial() throws ExcepcionDriverBBDD, ExcepcionNoFichPropiedades
    {
        if(!driverCargado)
        {
            try {
		Class.forName(driver);

                //Recuperar información del archivo de propiedades
                Properties prop = new Properties();
                prop.load(ClassLoader.getSystemClassLoader().getResourceAsStream(propertiesFile));

                url = prop.getProperty("url");
                usuario = prop.getProperty("username");
                clave = prop.getProperty("password");

                driverCargado = true;
                
	    } catch (ClassNotFoundException ex) { //No se ha cargado el driver
		ex.printStackTrace(System.out);
                throw new ExcepcionDriverBBDD(ex);
                
	    } catch (FileNotFoundException e) { //No se encuentra "configuration.properties"
                e.printStackTrace(System.out);
                //log.escribe(TDSLanguageUtils.getMessage("msg.error4"));
                throw new ExcepcionNoFichPropiedades(e);
                
            } catch (IOException ex) {
                //El fichero de propiedades incorrecto
                ex.printStackTrace(System.out);
                
            } catch (Exception ex){
                //Excepción inesperada
                ex.printStackTrace(System.out);
            }

	}

    }

    /**
     * Conecta con la BBDD
     */
    protected void conectar()
    {
        if(conexion == null)
        {
            try {
		conexion = DriverManager.getConnection(url, usuario, clave);
            } catch (Exception ex) {
                //La BDD no existe, esta Detenida, o login incorrecto
                //ex.printStackTrace(System.out);
                log.escribe(TDSLanguageUtils.getMessage("msg.error4"));
                Utils.muestraMensajeError(TDSLanguageUtils.getMessage("msg.error4"), TDSLanguageUtils.getMessage("msg.error"));
            }
		}
    }

    /**
     * Desconecta con la BBDD
     */
    protected void desconectar()
    {
        try
        {
            if (resultSet != null)
            {
		resultSet.close();
		resultSet = null;
            }
            if (statement != null)
            {
		statement.close();
		statement = null;
            }
            if (conexion != null) {
		conexion.close();
		conexion = null;
            }
	} catch (SQLException ex) {
            ex.printStackTrace(System.out);

	}
    }

    
    /**
     * Obtiene la conexion con la BBDD
     */
    public Connection getConexion(){
        return conexion;
    }

    
    /**
     * Comprueba si se esta conectado con la BBDD
     */
     public boolean conectado() {
        boolean estaConectado=false;
        try {
            estaConectado = !conexion.isClosed();
        } catch (SQLException ex) {
            log.escribe(ex.getMessage());
            ex.printStackTrace(System.out);
	}
        return estaConectado;
    }


}
